package com.tos.second.controller;

import com.tos.second.common.Result.Result;
import com.tos.second.common.basecontext.BaseContext;
import com.tos.second.common.constant.JwtClaimsConstant;
import com.tos.second.dto.UserChangePasswordDto;
import com.tos.second.dto.UserEditDto;
import com.tos.second.dto.UserLoginDto;
import com.tos.second.dto.UserRegisterDto;
import com.tos.second.entity.User;
import com.tos.second.properties.JwtProperties;
import com.tos.second.service.AdminService;
import com.tos.second.service.UserService;
import com.tos.second.utils.JwtUtil;
import com.tos.second.vo.UserLoginVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")

@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private AdminService adminService;

    @Autowired
    private JwtProperties jwtProperties;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 用户登录
     *
     * @param userLoginDto
     * @return
     */
    @PostMapping("/login")
    public Result<UserLoginVo> login(@RequestBody UserLoginDto userLoginDto) {
        log.info("用户登录：{}", userLoginDto.toString());
        // 用户登录验证
        UserLoginVo login = userService.login(userLoginDto);
        // 登录成功后，生成 JWT 令牌
        Map<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.ID, login.getId());
        String token = JwtUtil.createJWT(
                jwtProperties.getSecretKey(),
                jwtProperties.getTtl(),
                claims);
        // 获取tokenId
        String tokenId = JwtUtil.parseJWT(jwtProperties.getSecretKey(), token).getId();
        // 设置redisKey
        String redisKey = "user:" + login.getId() + ":tokenId";
        redisTemplate.opsForValue().set(redisKey, tokenId, jwtProperties.getTtl(), TimeUnit.MILLISECONDS);
        // 设置令牌
        login.setToken(token);
        // 返回登录成功的结果
        return Result.success(login);
    }


    /**
     * 用户注册
     * @param userRegisterDto
     * @return
     */
    @PostMapping("/register")
    public Result<String> register(@RequestBody UserRegisterDto userRegisterDto) {
        log.info("用户注册：{}", userRegisterDto.toString());
        userService.register(userRegisterDto);
        return Result.success("注册成功");
    }


    /**
     * 用户退出登录
     * @return
     */
    @PostMapping("/logout")
    public Result<String> logout() {
        log.info("用户退出登录");

        // 获取当前登录用户的 ID（从 JWT 令牌或 session 获取）
        Long currentUserId = BaseContext.getCurrentId();
        if (currentUserId == null) {
            return Result.error("用户未登录");
        }

        // 从 Redis 中删除该用户的会话信息
        String redisKey = "user:session:" + currentUserId;
        boolean isRemoved = redisTemplate.delete(redisKey);

        if (isRemoved) {
            log.info("用户会话信息已从 Redis 中删除，用户 ID: {}", currentUserId);
        } else {
            log.warn("Redis 中未找到用户会话信息，可能已过期或被删除，用户 ID: {}", currentUserId);
        }
        // 返回退出登录成功的消息
        return Result.success("退出登录成功");
    }



    /**
     * 修改密码
     * @param userChangePasswordDto
     * @return
     */
    @PutMapping("/changePassword")
    public Result<String> changePassword(@RequestBody UserChangePasswordDto userChangePasswordDto){
        log.info("用户修改密码：{}", userChangePasswordDto.toString());
        userService.changePassword(userChangePasswordDto);
        return Result.success("修改成功");
    }


    /**
     * 获取用户信息接口
     * @return
     */
    @GetMapping("/getUserMsg")
    public Result<User> getMsg(){
        // 线程停止1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("获取用户具体信息");
        return Result.success(adminService.getMsg());
    }

    /**
     * 修改用户信息接口
     * @param userEditDto
     * @return
     */
    @PostMapping("/changeMsg")
    public Result<String> editUser(@RequestBody UserEditDto userEditDto){
        log.info("修改用户信息：{}", userEditDto.toString());
        userService.editUser(userEditDto);
        return Result.success("修改成功");
    }

    /**
     * 用户充值接口
     * @param money
     * @return
     */
    @PutMapping("/charge/{money}")
    public Result<String> charge(@PathVariable BigDecimal money){
        log.info("用户充值：{}", money);
        userService.charge(money);
        return Result.success("充值成功");
    }


}